(function () {
  class Stack {
    constructor(initState = []) {
      let _dataSource = Symbol('_dataSource');
      Object.defineProperties(this, {
        '_dataSource': {  // 受保护属性
          writable: false,
          enumerable: false,
          value: _dataSource
        },
        [_dataSource]: { // 受保护属性,底层存储栈数据
          writable: false,
          enumerable: false,
          value: initState
        }
      })
    }
    // 入栈
    push(element) {
      const { _dataSource } = this;
      this[_dataSource].push(element);
      return element;
    }
    // 出栈
    pop() {
      const { _dataSource } = this;
      return this[_dataSource].pop();
    }
    // 查看栈顶元素
    peek() {
      const { _dataSource } = this;
      return this[_dataSource][this.len() - 1];
    }
    // 计算栈中的个数
    len() {
      const { _dataSource } = this;
      return this[_dataSource].length;
    }
    // 清空整个栈
    clear() {
      const { _dataSource } = this;
      this[_dataSource].length = 0;
    }
    // 查看整个栈中的元素
    toString() {
      const { _dataSource } = this;
      return [...this[_dataSource]];
    }
  }
  if (typeof module !== 'undefined' && typeof module.exports !== 'undefined' && typeof exports !== 'undefined') {
    module.exports = Stack;
  } else if (typeof window) {
    window.Stack = Stack;
  }
})();
